/******************************************
Cola_implementacion_arreglo.java
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Autor:
    Martín Guzmán
Fecha: 15 de julio de 2009
Descripción: Implementación de una cola
 * utilizando arreglos
*******************************************/
import java.util.ArrayList;
import java.lang.reflect.Array;

public class Cola_implementacion_arreglo<G> extends Cola<G> {
    private G[] arreglo;

    // método constructor
    public Cola_implementacion_arreglo()
    {
        super();
        disponibles=max;
        arreglo= (G[]) new Object[max];
    }

    //método que saca el último elemento de la pila
    public G pop(){
        System.out.println("Disponibles:"+disponibles);//TODO quitar esto...
        if(this.empty()==true){
            System.out.println("*** Lo sentimos, no puede sacar el último elemento de la pila debido a que está vacía ****");
            return null;
        }
        G temporal=arreglo[0];
        for(int i=0;i<arreglo.length-1;i++)
        {
            arreglo[i]=arreglo[i+1];
        }
        arreglo[arreglo.length-1]=null;
        disponibles+=1;
        return temporal;
    }

    
    //toString del la clase
    public String toString(){
        if(this.empty()==true){
            return "|--|--|--|--|--|--|--|--|--|--|";
        }
        String temporal = "|";
        for(int i=0;i<arreglo.length;i++)
            temporal+=""+((arreglo[i]!=null)?arreglo[i].toString():"--")+"|";
        return temporal;
    }

    //método que agrega un elemento a la pila
    public void push(G Elemento_G){

        if(full()!=true)
        {
            arreglo[this.ultima_Posicion()]=Elemento_G;
            disponibles-=1;
        }
        else
        {
            //esto no va a dar porque cuando se llama al método se controla esto...
            System.out.println("******** Lo sentimos, ya no hay espacios disponibles *****");
        }
    }
    
    //me retorna el índice en el que se encuentra el elemento dado
    //en caso de no encontrarse, retorna -1
    public int posicion_de(G Elemento_G){
        for(int i=0;i<this.arreglo.length;i++)
        {
            if(this.arreglo[i]!=null)
                if(this.arreglo[i].toString().compareTo(Elemento_G.toString())==0){
                    return i;
                }
        }
        return -1;
    }

    public G primera_Posicion() {
        return this.arreglo[0];
    }

}
